﻿// ## 2023/09/02 # 123 # 徐琨BUG临时处理 ##
// ## 2023/03/26 # 铃 # 修改地名.坐标.以适配新地图 ##
// ## 2022/09/22 # 铃 # 把开局设定优先级提到最高，防止被其他102挤掉 ##
// ## 2022/08/09 # 铃 # 开局可供玩家选择不同的人口模式系统 ##
// ## 2022/03/23 # 江东新风 # 战争迷雾开局时可选开关 ##
// ## 2022/02/14 # 江东新风 # 部分常量中文化 ##
// ## 2022/01/06 # 江东新风 # 根据新的头像设定重设美女头像 ##
// ## 2021/10/28 # 江东新风 # 单港关存活设定变更,增加对袁家之战,刘备之活跃的支持 ##
// ## 2021/10/26 # 江东新风 # 打开游戏次数记录##
// ## 2021/10/23 # 白马叔叔 # 新增自动分配145将功能 新增年龄随机增减功能 开局港关存活初始化 ##
// ## 2021/10/06 # 江东新风 # 修复刘备208年初会自动灭亡的bug##
// ## 2021/10/01 # 江东新风 # 超过一年，关闭单港关存活，防bug##
// ## 2021/07/01 # 白马叔叔 # 玩家军团优待，修复军团聚集不行动bug##
// ## 2021/04/12 # 白马叔叔 # 地标附近有军事建筑不再重建##
// ## 2021/04/07 # 白马叔叔 # AI优待，修复AI聚集不行动bug##
// ## 2021/03/02 # 江东新风 # 将特殊地名重建的设定也都全部挪至此处 ##
// ## 2021/02/17 # 江东新风 # 针对三顾剧本玩家直接选刘备剧本的情况作了设定 ##
// ## 2021/01/26 # 江东新风 # 针对三顾茅庐剧本的特殊设定 ##
// ## 2021/01/05 # 江东新风 # 只生成前200地名设施的bug修复 ##
// ## 2021/01/05 # 江东新风 # 只生成前200地名设施的bug修复 ##
// ## 2021/01/03 # 江东新风 # 特殊地名设施争夺的完善, 同时进行开局介绍 ##
namespace 特殊地名设施生成
{
	const int 地名建筑重生_发动时期 = 0; // 0: 每旬,  1: 每月第一旬,  2: 每季第一旬,  3: 每年第一旬 默认 1
	const bool 刘备存活测试 = true;
	const bool 自动分配开启 = true; // 是否开启自动分配145将功能。true为开启，false为关闭
	const bool 年龄增减开启 = true; // 是否开启开局随机增减死亡年龄的功能。true为开启，false为关闭
	const int ending = 670;			// 670是史实登场的武将末。设置为1000则为全武将末
	const bool tips_on = true;		// 是否开启载入存档时，提供游戏tips功能。true为开启，false为关闭
	////////////
	// 145将的名字，陶濬、陶浚重复，暂时不修，璜因van码表暂不支持，也不修
	array<string> person_145_name = { "成廉", "王沈", "殷观", "崔州平", "石韬",
									 "孟建", "宋忠", "殷署", "吕公", "妫览", "秦宜禄", "隐蕃", "尹礼", "路招", "殷礼",
									 "傅干", "吕建", "于毒", "费观", "朱铄", "聂友", "于糜", "卫兹", "应劭", "卫臻",
									 "刘理", "刘永", "朱绩", "阮籍", "袁春卿", "马延", "王观", "张顗", "韩猛", "王嗣",
									 "王思", "王商", "王必", "王方", "王谋", "刘延", "王连", "邯郸淳", "许汜", "王楷",
									 "韩珩", "王子服", "士孙瑞", "郭石", "郝普", "夏侯荣", "夏侯献", "夏侯儒", "夏侯兰", "李乐",
									 "何曾", "荀正", "金尚", "何宗", "贺达", "丁斐", "姜叙", "赵昂", "韦康", "何桢",
									 "吕乂", "何苗", "杨洪", "周群", "韩起", "周邵", "刘敏", "句扶", "张超", "臧洪",
									 "司马芝", "管承", "韩综", "韩忠", "庞淯", "赵俨", "管统", "韩范", "麹演", "许慈",
									 "许定", "刘先", "魏越", "鲜于辅", "赵昱", "嵇康", "常林", "杜袭", "张裔", "句安",
									 "惠衢", "黄琬", "黄射", "耿纪", "侯音", "陶濬", "公孙晃", "周朝", "陶黄", "高蕃",
									 "耿武", "皇甫闿", "习祯", "胡渊", "伍习", "顾邵", "顾承", "谷利", "胡综", "胡冲",
									 "马隆", "吴敦", "吴范", "伍孚", "蔡勋", "崔勇", "左灵", "史涣", "是仪", "史迹",
									 "射援", "射坚", "谢景", "修允", "周胤", "修则", "习珍", "朱盖", "朱光", "朱赞",
									 "柳隐", "李蒙", "李封", "陆胤", "曹安民", "岑威", "昌豨", "徐琨", "徐商", "段煨" };

	array<int> arr_age = { 0, 5, 10, 15, 20, 30 }; // 分别对应选项中的年龄

	class Main
	{

		pk::list<pk::person @> person_list;
		bool dead_appear = true;
		bool has_been_changed = false;
		Main()
		{
			pk::bind2(102, pk::trigger102_t(callback));
			pk::bind(102, pk::trigger102_t(force_set), -99);
			pk::bind(107, pk::trigger107_t(onNewDay));
			pk::bind(110, pk::trigger110_t(onNewYear));
			pk::bind(100, pk::trigger100_t(onGameTitle));
			pk::bind(108, pk::trigger108_t(onNewSeason));
			pk::bind2(107, pk::trigger107_t(onNewDay2), 0);
		}

		void onGameTitle()
		{
			// pk::message_box(pk::encode("绿薙"), pk::get_person(武将_貂蝉));
			if (pk::get_pk2_2_play_times() <= 3)
			{
				int beauty_id = 武将_貂蝉;
				// if (mod专属设定 == 2) beauty_id = 血色_武瞾;//默认剧本为7号剧本，可以调用貂蝉
				pk::person @美女 = pk::get_person(beauty_id);
				pk::play_bgm_file(pk::game_dir + "mediaEX/voice/diaochan/Diaochan6.ogg", false, 60);
				pk::message_box(pk::encode(pk::format("这是您\x1b[27x第{}次\x1b[0x打开\x1b[28x{}\x1b[0x。\n本版本有很多新的游戏机制，未熟悉游戏机制之前切勿选择\x1b[16x超级难度。", pk::get_pk2_2_play_times(), pk::get_mod_version())), 美女);
				pk::message_box(pk::encode("能在\x1b[27x前3次\x1b[0x打开游戏时见到我，说明你已\x1b[28x成功\x1b[0x运行pk2.2修改。"), 美女);
				pk::message_box(pk::encode("目前因\x1b[18x决战制霸\x1b[0x及\x1b[18x教模式\x1b[0x和\x1b[1x新地图不兼容\x1b[0x，按钮已被禁用，另外\x1b[18x情报履历\x1b[0x如选择\x1b[18x简单\x1b[0x将\x1b[1x错过重要游戏提示\x1b[0x，也已被禁用。\n \x1b[22x请勿费神\x1b[0x寻找打开方式。"), 美女);
				pk::message_box(pk::encode("如遇到开局军师介绍完闪退或出征闪退，系显卡问题，请用\x1b[28xpkHH\x1b[0x修改器\x1b[18x关闭光环可视化\x1b[0x。"), 美女);
				pk::message_box(pk::encode("默认情况下\x1b[18x不开启迷雾\x1b[0x。\n只有\x1b[27x超级难度\x1b[0x下可在\x1b[18x开局选择开启\x1b[0x。"), 美女);
			}
			if (pk::get_pk2_2_play_times() == 200)
			{
				pk::person @小乔 = pk::get_person(武将_小乔);
				pk::message_box(pk::encode(pk::format("这是您\x1b[27x{}次\x1b[0x打开\x1b[28x{}\x1b[0x版本。\n感谢阁下对PK2.2的厚爱，祝阁下武运昌隆。", pk::get_pk2_2_play_times(), pk::get_mod_version())), 小乔);
			}

			if (pk::get_pk2_2_play_times() <= 3)
			{
				pk::person @小乔 = pk::get_person(武将_小乔);
				pk::message_box(pk::encode("友情提示，在您未熟悉游戏新机制之前\x1b[16x请勿\x1b[0x选择\x1b[16x超级难度\x1b[0x!"), 小乔);
			}
		}

		void callback()
		{
			ch::get_set_p(0).set_onebase_survive(true);
			//pk::trace(pk::format("剧本载入前，存活：{}", pk::get_onebase_survive()));
			if (!pk::get_scenario().loaded)
			{
				//***************因为为一个武将改剧本麻烦，临时设定*************//
				// 如果剧本未载入，就是开局时，将三顾茅庐剧本的单港关存活开启，防止还没选择刘备就灭亡
				if (check_scenario())
				{
					单港关存活剧本特殊处理();
					// pk::trace(pk::format("剧本载入前，存活：{}", pk::get_onebase_survive()));
					// pk::set_portgate_survive(true);
					// pk::trace(pk::format("存活：{}", pk::core["单港关存活"]));
				}

				美女开局介绍();

				// set_den_pos();
				// gen_spec_terrain_check();
				set_troops_policy();
			}
			if (pk::get_scenario().loaded)
			{

				// 直接按照mod设定设置开关
				ch::get_set_p(0).set_onebase_survive(ch::get_set_p(0).get_mod_set(单港关存活_开关));
				return; // 只要剧本已载入，就跳过
			}

		} // callback()

		void force_set()
		{
			if (!pk::get_scenario().loaded) 重设小城归属();
			gen_spec_terrain_check();
		}

		void onNewDay2()
		{
			//pk::trace(pk::format("剧本载入前，存活：{}", pk::get_onebase_survive()));
			if (tips_on and pk::get_player_count() > 0)
			{
				if ((pk::get_scenario().difficulty == 难易度_超级 or pk::get_scenario().difficulty == 难易度_上级) and (pk::get_day() == 1) and pk::is_first_month_of_quarter(pk::get_month()))
					pk::scene(pk::scene_t(scene_开局tips)); // 载入存档开局tips

				else if ((pk::get_scenario().difficulty == 难易度_初级) and (pk::get_day() == 1))
					pk::scene(pk::scene_t(scene_开局tips)); // 载入存档开局tips
			}
		}

		void mod初始设置()
		{
			pk::wait(500);
			int beauty_id = 武将_貂蝉;
			if (pk::get_scenario().no == 血色剧本)
				beauty_id = 血色_武瞾;
			pk::person @美女 = pk::get_person(beauty_id);
			pk::message_box(pk::encode("正式开始游戏前，请设定下本mod的一些自定义设置。\n（这些设定在游戏开始后不支持更改，建议\x1b[27x慎重\x1b[0x决定）。"), 美女);

			// 将对话框开启放到游戏初始化中，会导致进不了游戏。。。
			// init_dlg120();
			// new_dialog120_.open();
		}

		void 重设小城归属()
		{
			for (int base_id = 城市_末; base_id < 据点_末; base_id++)
			{
				pk::building @building0 = pk::get_building(base_id);
				auto person_list = pk::get_person_list(pk::get_building(base_id), pk::mibun_flags(身份_君主, 身份_都督));
				if (person_list.count >= 1) continue;

				int city_id = pk::get_city_id(building0.pos);
				pk::city @city0 = pk::get_city(city_id);
				if (city0.get_force_id() == -1 or city0.get_force_id() >= 势力_末) continue;
				pk::force @force = pk::get_force(city0.get_force_id());
				building0.init_force = force.get_id();

				if (building0.facility == 设施_关隘)
				{
					pk::gate@ gate0 = pk::get_gate(base_id - 建筑_城市末);
					gate0.district = city0.district;
					gate0.update();
					//pk::trace(pk::format("开局设定.关卡:{},设定为势力：{}", pk::decode(pk::get_name(building0)), pk::decode(pk::get_name(force))));
				}
				if (building0.facility == 设施_港口)
				{
					pk::port@ port0 = pk::get_port(base_id - 建筑_关卡末);
					port0.district = city0.district;
					port0.update();
					//pk::trace(pk::format("开局设定,小城{},设定为势力：{}", pk::decode(pk::get_name(building0)), pk::decode(pk::get_name(force))));
				}
			}

			//同步重设封地的归属地
			for (int16 i = 0; i < ch::get_spec_end(); ++i)
			{
				pk::point pos0 = ch::get_spec_pos(i);
				pk::building @base = pk::get_building(pk::get_building_id(pos0));
				pk::building @building0 = pk::get_building(pos0);
				if (building0 is null)
					continue;

				if (i >= ch::get_normal_spec_end())
				{
					auto spec_t = ch::get_spec_p(i);
					building0.init_force = 势力_盗贼;
					if (i == ch::get_spec_end() - 1)
						spec_t.person = 798;
					else  spec_t.person = 799;
					spec_t.set_spec_set(SPEC_MAX_INC, true);
					spec_t.set_gold(3000);
					spec_t.set_food(80000);
					spec_t.set_troops(30000);
					auto spec_building = pk::get_building(i + 100);
					spec_building.hp = 8000;

				}

				else
					building0.init_force = base.get_force_id();
				building0.update();
			}


			//由于小城所属的移动,可能出现部分武将所在异常,用这个办法强行把有身份的武将归属所在城市.以免报错,如果后续有分配错误,去剧本修改所在即可
			for (int i = 0; i < 非贼武将_末; ++i)
			{
				pk::person @person = pk::get_person(i);
				if (pk::is_alive(person) and pk::is_valid_base_id(person.location) and pk::check_mibun(person, pk::mibun_flags(身份_君主, 身份_都督, 身份_太守, 身份_一般)))
				{
					if (pk::get_building(person.location).get_district_id() > -1)
						pk::set_district(person, pk::get_building(person.location).get_district_id());
				}
			}

		}



		void 美女开局介绍()
		{
			int per_num = 40;
			int index_num = ch::get_spec_end() / per_num + 1;
			set_place_facility(40, 0);

			int beauty_id = 武将_貂蝉;
			if (pk::get_scenario().no == 血色剧本)
				beauty_id = 血色_武瞾;
			pk::person @美女 = pk::get_person(beauty_id);
			if (pk::get_scenario().no == 血色剧本)
				pk::message_box(pk::encode("欢迎来到不一样的\x1b[29x血色衣冠\x1b[0x。"), 美女);
			else
				pk::message_box(pk::encode("欢迎来到不一样的\x1b[30x三国志\x1b[0x。"), 美女);
			set_place_facility(40, 1);
			pk::message_box(pk::encode("请容奴家给您简单介绍下这个世界。"), 美女);
			set_place_facility(40, 2);

			int choose2 = pk::choose({ pk::encode("  是  "), pk::encode("  否  ") }, pk::encode("是否需要了解本作\x1b[27x新增设定?\n(初次游玩此版本建议选择观看)"), 美女);
			set_place_facility(40, 3);
			if (choose2 == 0)
			{
				pk::message_box(pk::encode("首先介绍下本作的\x1b[27x新城防设定\x1b[0x。\n城市在满城防之后，依然可以通过筑城内政扩充城防上限，称为\x1b[27x额外城防。"), 美女);
				set_place_facility(40, 4);
				pk::message_box(pk::encode("在城市上方面板可以看到\x1b[27x额外城防\x1b[0x数值。"), 美女);
				set_place_facility(40, 5);
				pk::message_box(pk::encode("新的城防系统中，城市的\x1b[27x攻击力、防御力\x1b[0x和城市的\x1b[27x士气、城防\x1b[0x挂钩，对于坚固的城市应当设法降低士气后再行进攻。"), 美女);
				set_place_facility(40, 6);
				pk::message_box(pk::encode("围城可以快速降低守城方士气。\n围城的\x1b[27x兵力越多、持续时间越久\x1b[0x，城市士气下降越快。"), 美女);

				pk::message_box(pk::encode("当城市的士气很低之时，城防会形同虚设，即使是坚固的城市也很容易被攻下哦~"), 美女);

				int choose3 = pk::choose({ pk::encode("  是  "), pk::encode("  否  ") }, pk::encode("是否需要进一步了解本作\x1b[27x自动内政\x1b[0x设定?\n(初次游玩此版本建议选择观看)"), 美女);
				if (choose3 == 0)
				{
					pk::message_box(pk::encode("自动内政通过\x1b[27x设定项目开支、设定内政官\x1b[0x的方式进行。"), 美女);

					pk::message_box(pk::encode("\x1b[27x开支设定\x1b[0x的是根据城市的收入，分配一定的比例自动进行。"), 美女);

					pk::message_box(pk::encode("也可以通过\x1b[27x方针设定\x1b[0x一键设定预设值呢~"), 美女);
					int choose = pk::choose({ pk::encode("  是  "), pk::encode("  否  ") }, pk::encode("是否观看简要教程?\n(初次游玩此版本建议选择观看)"), 美女);
					if (choose == 0)
					{
						pk::message_box(pk::encode("现在\x1b[27x带有地名的设施\x1b[0x将不会被破坏，耐久降为0后将\x1b[1x自动变更归属\x1b[0x。"), 美女);

						pk::message_box(pk::encode("敌方势力可能会派遣高武力武将刺杀我方高威胁低武力武将。"), 美女);

						pk::message_box(pk::encode("除了与周边国家保持好关系，还需要注重对异族贼兵的防范，他们可能会和其他势力达成交易突袭我方。"), 美女);

						pk::message_box(pk::encode("对啦，本作中招兵虽然更便宜了，但是养兵需要\x1b[27x军饷，\x1b[0x军饷不足会导致士兵逃跑,记得要关注城市收支哦~"), 美女);
						if (pk::choose({ pk::encode("  是  "), pk::encode("  否  ") }, pk::encode("是否继续观看教程?"), 美女) == 0)
						{
							pk::message_box(pk::encode("没事的时候，可以多用君主拜访下武将，会有意外惊喜哦。"), 美女);
							pk::message_box(pk::encode("武将也会生病的，生病的时候记得照顾好他们，免得造成终生遗憾。"), 美女);
							pk::message_box(pk::encode("有时候，情报履历中会告知一些隐世不出的人才，记得关注哦~"), 美女);
							pk::message_box(pk::encode("本作中,\x1b[27x人口\x1b[0x会成为最重要的资源，请多加利用~"), 美女);
						}
					}
				}
			}
			else
			{
				for (int i = 4; i < index_num; ++i)
				{
					set_place_facility(40, i);
				}
			}
			if (pk::get_scenario().difficulty == 难易度_超级)
				pk::message_box(pk::encode("再次友情提示，在您未熟悉游戏新机制之前\x1b[16x请勿\x1b[0x选择\x1b[16x超级难度\x1b[0x!"), 美女);

			if (pk::get_scenario().no == 血色剧本)
				pk::message_box(pk::encode("友情提示，血色剧本基于血色5.0，为\x1b[29x单特技剧本\x1b[0x，无功阶特技。"), 美女);

			if (pk::get_scenario().difficulty == 难易度_超级)
			{
				bool fog_open = (pk::choose({ pk::encode("  是  "), pk::encode("  否  ") }, pk::encode("是否需要挑战\x1b[27x战争迷雾\x1b[0x下游玩?\n(战争迷雾下，敌方部队在视野范围外不可见，难度较高，请谨慎选择。)"), 美女) == 0);
				pk::set_fog_state(fog_open, false);
			}
			else
				pk::set_fog_state(false, false);

			if (自动分配开启)
				person_list = get_145_person(); // 开启此自动分配功能时，获取存活145将的列表
			if (person_list.count > 0)			// 如果有145将登场
			{
				if (pk::choose({ pk::encode("  是  "), pk::encode("  否  ") }, pk::encode("是否按史实归属自动配置 \x1b[1x「145将」\x1b[0x?\n自动配置武将到史实所属君主旗下,\n已手动配置过归属的,则不会影响."), 美女) == 0)
				{
					// pk::trace(pk::format("编号：{}，是否假想：{}", pk::get_scenario().no, pk::get_scenario().virtual));
					if (pk::get_scenario().debut == 登场_史实) // 武将是史实登场
					{
						if (!pk::get_scenario().virtual)
						{
							if (pk::choose({ pk::encode("  是  "), pk::encode("  否  ") }, pk::encode("部分「145将」已超过死亡年龄,\n选「是」则已过死亡年龄的\x1b[1x仍然登场\x1b[0x，\n选「否」则已过死亡年龄的\x1b[29x不登场并死亡\x1b[0x."), 美女) == 1)
								dead_appear = false; // 非寿命无效的，如英雄集结剧本时才询问，选否则实际已经死亡的直接杀死不再配置
						}
						set_145_person_service(); // 执行自动配置145将
					}
					else
					{
						if (pk::choose({ pk::encode("  是  "), pk::encode("  否  ") }, pk::encode("目前武将登场设置为「假想」，\n是否仍然自动配置到所属君主旗下?"), 美女) == 0)
						{
							if (!pk::get_scenario().virtual)
							{
								if (pk::choose({ pk::encode("  是  "), pk::encode("  否  ") }, pk::encode("部分「145将」已超过死亡年龄,\n选「是」则已过死亡年龄的\x1b[1x仍然登场\x1b[0x，\n选「否」则已过死亡年龄的\x1b[29x不登场并死亡\x1b[0x."), 美女) == 1)
									dead_appear = false; // 非寿命无效的，如英雄集结剧本时才询问，选否则实际已经死亡的直接杀死不再配置
							}
							set_145_person_service(); // 执行自动配置145将
						}
					}
				}
				if (has_been_changed)
					pk::message_box(pk::encode("哼！\n你动过妾身喜爱的「145将」了吧？！"), 美女);
			}

			if (年龄增减开启 && !pk::get_scenario().virtual && pk::get_scenario().life != 寿命_假想) // 如果开启随机年龄功能并且是史实剧本，不是假想99岁
			{
				pk::message_box(pk::encode("为了增加游戏趣味性,\n您可选择在某一范围内随机改变全体武将的寿命哦~"), 美女);
				array<string> answers =
				{
					pk::encode("  依照史实寿命  "),
					pk::encode(pk::format("  {} 年以内随机增减  ", arr_age[1])),
					pk::encode(pk::format("  {}年以内随机增减  ", arr_age[2])),
					pk::encode(pk::format("  {}年以内随机增减  ", arr_age[3])),
					pk::encode(pk::format("  {}年以内随机增减  ", arr_age[4])),
					pk::encode(pk::format("  {}年以内随机增减  ", arr_age[5])) };
				int n = pk::choose(pk::encode("是否要随机增减寿命？\n选「史实寿命」则不增不减,\n选「随机增减」则在范围内随机增加或减少数年."), answers);
				if (n != 0)
					random_age_within(n); // 执行随机年龄增减n
			}

			return;
		}

		void 单港关存活剧本特殊处理()
		{
			ch::get_set_p(0).set_onebase_survive(true);//选不选刘备都默认先打开
			if (pk::get_force(1).player != -1)
			{
				int beauty_id = 武将_貂蝉;
				if (pk::get_scenario().no == 血色剧本)
					beauty_id = 血色_武瞾;
				pk::person @美女 = pk::get_person(beauty_id);
				pk::message_box(pk::encode("阁下果然英武不凡，敢挑战三顾茅庐的刘备势力~"), 美女);
				pk::message_box(pk::encode("需提醒阁下，本剧本中，所有势力主城被灭，\x1b[27x仍可依靠港关存活\x1b[0x。\n如果后续占领城市后，想要关闭该功能，请于\x1b[2xshift右键\x1b[0x菜单关闭。"), 美女);

				// pk::trace("cpp 873 ,pos1");
			}
			else
			{
				int beauty_id = 武将_貂蝉;
				if (pk::get_scenario().no == 血色剧本)
					beauty_id = 血色_武瞾;
				pk::person @美女 = pk::get_person(beauty_id);
				string scenario_name = pk::decode(pk::get_scenario().name);
				pk::message_box(pk::encode(pk::format("阁下现在选择的是\x1b[1x{}\x1b[0x剧本，这可是非常有意思的剧本呀~", scenario_name)), 美女);
				pk::message_box(pk::encode(pk::format("不过\x1b[1x{}\x1b[0x剧本最有意思的势力应该是刘备势力吧。", scenario_name)), 美女);
				pk::message_box(pk::encode("要提醒的是，刘备在本剧本中初始领地只有小城，难度非常高。"), 美女);
				int choise = pk::choose({ pk::encode("  是  "), pk::encode("  否  ") }, pk::encode("是否选择扮演刘备势力?"), 美女);
				if (choise == 1)
				{
					return;
				}
				pk::message_box(pk::encode("哈哈，阁下果然英武不凡，敢挑战刘备势力~\n那就预祝阁下武运昌隆吧~"), 美女);
				pk::message_box(pk::encode("对了，还需提醒阁下，本剧本中，所有势力主城被灭，\x1b[27x仍可依靠港关存活\x1b[0x。\n如果后续占领城市后，想要关闭该功能，请于\x1b[2xshift右键\x1b[0x菜单关闭。"), 美女);
				for (int i = 0; i < 非贼势力_末; ++i)
				{
					pk::force @force0 = pk::get_force(i);
					if (force0.player == 0)
					{
						force0.player = -1;
						force0.update();
					}
				}
				pk::force @force1 = pk::get_force(1);
				force1.player = 0;
				force1.update();
				// pk::trace("cpp 873 ,pos1");
				// pk::trace("cpp 873 ,pos2");
				// settinginfo@ set1() = @setting_ex;
				// pk::trace(pk::format("873,{}{}", set1.set_port_gate_survive, set1.enable_port_gate_survive));
				return;
			}
		}

		void onNewDay()
		{
			//pk::trace(pk::format("回合载入前，存活：{}", pk::get_onebase_survive()));
			change_place_facility(地名_末, 0);
			if (地名建筑重生_发动时期 == 0)
				revive_place_facility(地名_末, 0);
			else if (地名建筑重生_发动时期 == 1 and (pk::get_day() == 1))
				revive_place_facility(地名_末, 0);
			else if (地名建筑重生_发动时期 == 2 and (pk::get_day() == 1) and pk::is_first_month_of_quarter(pk::get_month()))
				revive_place_facility(地名_末, 0);
			else if (地名建筑重生_发动时期 == 3 and (pk::get_day() == 1) and pk::get_month() == 1)
				revive_place_facility(地名_末, 0);

			// 加入对三顾剧本单港关存活的开关，超过一年自动关闭
		}

		void onNewYear()
		{
			// 加入对三顾剧本单港关存活的开关，超过2年自动关闭
			// 不再进行关闭，按玩家设定的来
			//if (pk::get_elapsed_days() >= 720) // 36旬为1年---这个函数返回值是一旬返回10天
			//{
			//	// pk::trace(pk::format("时间大于1年，关闭单港关存活，目前经过天数：{}", pk::get_elapsed_days()));
			//	pk::set_onebase_survive(false);
			//	settinginfo @set0 = @setting_ex;
			//	set0.set_port_gate_survive = false;
			//	set0.enable_port_gate_survive = false;
			//}
			//return;
		}

		void set_place_facility(int per_length, int order)
		{
			int start = per_length * order;
			int end = start + per_length;
			if (start > ch::get_spec_end())
				return;
			if (end > ch::get_spec_end())
				end = ch::get_spec_end();
			for (int i = start; i < end; i++)
			{
				pk::point pos = ch::get_spec_pos(i);
				pk::hex @hex0 = pk::get_hex(pos);
				int force_id = -1; // 原本是-1无归属，改成46
				//pk::trace(pk::format("revive:{}, {}, {}",i,pos.x,pos.y));
				pk::building @area_building = pk::get_building(pk::get_building_id(pos));
				if (pk::is_alive(area_building))
					force_id = area_building.get_force_id();
				if (hex0.has_building)
					pk::kill(pk::get_building(pos));
				pk::building @building0 = pk::create_spec(pk::get_facility(ch::get_spec_facility_id(i)), pos, force_id, i); // 改成重建地名建筑专用函数
				pk::complete(building0);
				ch::reset_spec(i, building0.get_id());
			}
		}

		void revive_place_facility(int per_length, int order)
		{
			int start = per_length * order;
			int end = start + per_length;
			if (start > ch::get_spec_end())
				return;
			if (end > ch::get_spec_end())
				end = ch::get_spec_end();
			for (int i = start; i < end; i++)
			{
				pk::point pos = ch::get_spec_pos(i);
				pk::hex @hex0 = pk::get_hex(pos);
				if (hex0.has_building or hex0.has_unit)
					continue;
				if (military_building_around(pos, 1, 2))
					continue;	   // 2格内是否有军事设施
				int force_id = -1; // 原本是-1无归属，改成46
				pk::building@ area_building = pk::get_building(pk::get_building_id(pos));
				if (pk::is_alive(area_building)) force_id = area_building.get_force_id();
				if (hex0.has_building) pk::kill(pk::get_building(pos));
				// pk::trace(pk::format("revive:{}, {}, {}",i,pos.x,pos.y));
				pk::building @building0 = pk::create_spec(pk::get_facility(ch::get_spec_facility_id(i)), pos, -1, i); // 改成重建地名建筑专用函数
				pk::complete(building0);
				if (pk::is_alive(building0)) ch::reset_spec(i, building0.get_id());
			}
		}

		void change_place_facility(int per_length, int order)
		{
			int start = per_length * order;
			int end = start + per_length;
			if (start > ch::get_spec_end())
				return;
			if (end > ch::get_spec_end())
				end = ch::get_spec_end();
			for (int i = start; i < end; i++)
			{
				pk::point pos = ch::get_spec_pos(i);
				pk::hex @hex0 = pk::get_hex(pos);
				if (hex0.has_unit)
					continue;
				if (!hex0.has_building)
					continue; // 地标上没有建筑物，跳过
				pk::city @area_city = pk::get_city(pk::get_city_id(pos));
				if (area_city.is_player()) // 是玩家势力
				{
					if (!pk::is_player_controlled(area_city)) // 是玩家的委任军团
					{
						if (!pk::is_in_screen(pos) and (pk::get_building(pos)).get_force_id() == -1) // pos不在屏幕内且地标建筑无归属时
						{
							pk::building @spec_building = pk::get_building(pos);
							int building_id = spec_building.get_id();
							int spec_id = ch::to_spec_id(building_id);
							if (!ch::is_valid_spec_id(spec_id))
								continue;
							spec_building.init_force = 势力_盗贼;
							// pk::set_district(spec_building, pk::get_district(pk::get_force(势力_盗贼).get_district_id()), /*占领*/势力_盗贼);
							pk::history_log(pos, 势力_盗贼, pk::encode(pk::format("\x1b[1x{}\x1b[0x周围被贼兵占据了.", ch::get_spec_name(spec_id))));
						}
					}
					continue;
				}
				if (area_city.get_force_id() == -1)
					continue;																 // 空城无势力归属跳过
				if (!pk::is_in_screen(pos) and (pk::get_building(pos)).get_force_id() == -1) // pos不在屏幕内且地标建筑无归属时
				{
					pk::building @spec_building = pk::get_building(pos);
					int building_id = spec_building.get_id();
					int spec_id = ch::to_spec_id(building_id);
					if (!ch::is_valid_spec_id(spec_id))
						continue;
					spec_building.init_force = 势力_盗贼;
					// pk::set_district(spec_building, pk::get_district(pk::get_force(势力_盗贼).get_district_id()), /*占领*/ 势力_盗贼);
					//  pk::history_log(pos, 势力_盗贼, pk::encode(pk::format("\x1b[1x{}\x1b[0x周围被贼兵占据了.", ch::get_spec_name(spec_id))));
				}
			}
		}

		// 附近是否存在军事设施
		bool military_building_around(pk::point pos, int min_distance, int max_distance)
		{
			auto arr = pk::range(pos, min_distance, max_distance);
			for (int i = 0; i < int(arr.length); i++)
			{
				if ((pk::get_hex(arr[i])).has_building)
				{
					auto building_0 = pk::get_building(arr[i]);
					if ((building_0.facility >= 设施_阵 and building_0.facility <= 设施_连弩橹) or (building_0.facility >= 设施_投石台 and building_0.facility <= 设施_根据地2))
						return true;
				}
			}
			return false;
		}

		bool check_scenario()
		{
			if (pk::get_scenario().no == 4)
			{
				string scenario_name = pk::decode(pk::get_scenario().name);
				if (scenario_name == "三顾茅庐" or scenario_name == "刘备之活跃")
					return true;
			}
			else if (pk::get_scenario().no == 9)
			{
				string scenario_name = pk::decode(pk::get_scenario().name);
				if (scenario_name == "袁家之战")
					return true;
			}

			if (pk::is_new_map())
			{
				if (pk::get_scenario().no == 1)
				{
					string scenario_name = pk::decode(pk::get_scenario().name);
					if (scenario_name == "反董卓联合军")
						return true;
				}
			}

			return false;
		}

		// 按照史实归属配置145将，剧本、姓名都要一致
		void set_145_person_service()
		{
			int person_list_count = person_list.count;
			for (int j = 0; j < person_list_count; j++)
			{
				pk::person @person_i = person_list[j];
				int person_id = person_i.get_id();

				if (!dead_appear && pk::get_scenario().start_year > person_i.death)
				{
					// pk::trace(pk::format("被杀死id：{}，名字：{}，身份：{}", person_id, pk::decode(pk::get_name(person_i)), person_i.mibun));
					pk::kill(person_i, null, null, null, 1); // 直接杀死符合条件的人
					continue;
				}
				// pk::trace(pk::format("id：{}，名字：{}，身份：{}", person_id, pk::decode(pk::get_name(person_i)), person_i.mibun));
				int kunshu_id = -1; // 归属的君主id初始化
				switch (person_id)
				{
					case 855:
						kunshu_id = 660;
						break; // 成廉-吕布
					case 856:
						kunshu_id = 228;
						break; // 王沈-司马昭
					case 857:
						kunshu_id = 635;
						break; // 殷观-刘备
					case 858:
						kunshu_id = -1;
						break; // 崔州平-不仕
					case 859:
						kunshu_id = pk::get_scenario().start_year < 208 ? 708 : 343;
						break; // 石韬-司马徽和曹操
					case 860:
						kunshu_id = pk::get_scenario().start_year < 208 ? 708 : 343;
						break; // 孟建-司马徽和曹操
					case 861:
						kunshu_id = 636;
						break; // 宋忠-刘表
					case 862:
						kunshu_id = 343;
						break; // 殷署-曹操
					case 863:
						kunshu_id = 636;
						break; // 吕公-刘表
					case 864:
						kunshu_id = 367;
						break; // 妫览-孙权
					case 865:
						kunshu_id = 660;
						break; // 秦宜禄-吕布
					case 866:
						kunshu_id = 328;
						break; // 隐蕃-曹叡
					case 867:
						kunshu_id = 346;
						break; // 尹礼-臧霸
					case 868:
						kunshu_id = pk::get_scenario().start_year < 221 ? 343 : 328;
						break; // 路招-曹操和曹叡
					case 869:
						kunshu_id = 367;
						break; // 殷礼-孙权
					case 870:
						kunshu_id = pk::get_scenario().start_year < 221 ? 343 : 328;
						break; // 傅干-曹操和曹叡
					case 871:
						kunshu_id = pk::get_scenario().start_year < 221 ? 343 : 328;
						break; // 吕建-曹操和曹叡
					case 872:
						kunshu_id = -1;
						break; // 于毒-山贼无
					case 873:
						kunshu_id = pk::get_scenario().start_year < 215 ? 624 : (pk::get_scenario().start_year < 224 ? 635 : 629);
						break; // 费观-刘璋和刘备父子
					case 874:
						kunshu_id = pk::get_scenario().start_year < 227 ? 347 : 328;
						break; // 朱铄-曹丕父子
					case 875:
						kunshu_id = 367;
						break; // 聂友-孙权
					case 876:
						kunshu_id = 642;
						break; // 于糜-刘繇
					case 877:
						kunshu_id = 343;
						break; // 卫兹-曹操
					case 878:
						kunshu_id = pk::get_scenario().start_year < 194 ? 189 : 18;
						break; // 应劭-皇甫嵩（汉）和袁绍
					case 879:
						kunshu_id = pk::get_scenario().start_year < 221 ? 343 : 328;
						break; // 卫臻-曹操和曹叡
					case 880:
						kunshu_id = 629;
						break; // 刘理-刘禅
					case 881:
						kunshu_id = 629;
						break; // 刘永-刘禅
					case 882:
						kunshu_id = 367;
						break; // 朱绩-孙权
					case 883:
						kunshu_id = -1;
						break; // 阮籍-不仕
					case 884:
						kunshu_id = 18;
						break; // 袁春卿-袁绍
					case 885:
						kunshu_id = pk::get_scenario().start_year < 208 ? 17 : 343;
						break; // 马延-袁尚和曹操
					case 886:
						kunshu_id = pk::get_scenario().start_year < 221 ? 343 : 225;
						break; // 王观-曹操和司马懿
					case 887:
						kunshu_id = 17;
						break; // 张顗-袁尚
					case 888:
						kunshu_id = 18;
						break; // 韩猛-袁绍
					case 889:
						kunshu_id = 629;
						break; // 王嗣-刘禅
					case 890:
						kunshu_id = pk::get_scenario().start_year < 221 ? 343 : 328;
						break; // 王思-曹操和曹叡
					case 891:
						kunshu_id = 624;
						break; // 王商-刘璋
					case 892:
						kunshu_id = 343;
						break; // 王必-曹操
					case 893:
						kunshu_id = 493;
						break; // 王方-董卓
					case 894:
						kunshu_id = pk::get_scenario().start_year < 215 ? 624 : (pk::get_scenario().start_year < 224 ? 635 : 629);
						break; // 王谋-刘璋和刘备父子
					case 895:
						kunshu_id = pk::get_scenario().start_year < 221 ? 343 : 347;
						break; // 刘延-曹操父子
					case 896:
						kunshu_id = pk::get_scenario().start_year < 215 ? 624 : (pk::get_scenario().start_year < 224 ? 635 : 629);
						break; // 王连-刘璋和刘备父子
					case 897:
						kunshu_id = pk::get_scenario().start_year < 208 ? 708 : 343;
						break; // 邯郸淳-司马徽和曹操
					case 898:
						kunshu_id = pk::get_scenario().start_year < 199 ? 660 : 636;
						break; // 许汜-吕布和刘表
					case 899:
						kunshu_id = 660;
						break; // 王楷-吕布
					case 900:
						kunshu_id = 13;
						break; // 韩珩-袁熙
					case 901:
						kunshu_id = 491;
						break; // 王子服-董承
					case 902:
						kunshu_id = 189;
						break; // 士孙瑞-皇甫嵩
					case 903:
						kunshu_id = -1;
						break; // 郭石-山贼无
					case 904:
						kunshu_id = pk::get_scenario().start_year < 224 ? 635 : 367;
						break; // 郝普-刘备和孙权
					case 905:
						kunshu_id = 343;
						break; // 夏侯荣-曹操
					case 906:
						kunshu_id = 328;
						break; // 夏侯献-曹叡
					case 907:
						kunshu_id = 328;
						break; // 夏侯儒-曹叡
					case 908:
						kunshu_id = pk::get_scenario().start_year < 208 ? 85 : 635;
						break; // 夏侯兰-夏侯惇和刘备
					case 909:
						kunshu_id = -1;
						break; // 李乐-山贼无
					case 910:
						kunshu_id = 228;
						break; // 何曾-司马昭
					case 911:
						kunshu_id = 16;
						break; // 荀正-袁术
					case 912:
						kunshu_id = 189;
						break; // 金尚-皇甫嵩
					case 913:
						kunshu_id = pk::get_scenario().start_year < 215 ? 624 : (pk::get_scenario().start_year < 224 ? 635 : 629);
						break; // 何宗-刘璋和刘备父子
					case 914:
						kunshu_id = 367;
						break; // 贺达-孙权
					case 915:
						kunshu_id = pk::get_scenario().start_year < 221 ? 343 : 328;
						break; // 丁斐-曹操和曹叡
					case 916:
						kunshu_id = pk::get_scenario().start_year < 215 ? -1 : 347;
						break; // 姜叙-韦康和曹丕
					case 917:
						kunshu_id = pk::get_scenario().start_year < 215 ? -1 : 343;
						break; // 赵昂-韦康和曹操
					case 918:
						kunshu_id = pk::get_scenario().start_year < 197 ? -1 : 343;
						break; // 韦康-东汉地方政权和曹操
					case 919:
						kunshu_id = 228;
						break; // 何桢-司马昭
					case 920:
						kunshu_id = pk::get_scenario().start_year < 215 ? 624 : (pk::get_scenario().start_year < 224 ? 635 : 629);
						break; // 吕乂-刘璋和刘备父子
					case 921:
						kunshu_id = 91;
						break; // 何苗-何进
					case 922:
						kunshu_id = pk::get_scenario().start_year < 215 ? 624 : (pk::get_scenario().start_year < 224 ? 635 : 629);
						break; // 杨洪-刘璋和刘备父子
					case 923:
						kunshu_id = pk::get_scenario().start_year < 215 ? 624 : (pk::get_scenario().start_year < 224 ? 635 : 629);
						break; // 周群-刘璋和刘备父子
					case 924:
						kunshu_id = 177;
						break; // 韩起-公孙渊
					case 925:
						kunshu_id = 367;
						break; // 周邵-孙权
					case 926:
						kunshu_id = pk::get_scenario().start_year < 224 ? 635 : 629;
						break; // 刘敏-刘备父子
					case 927:
						kunshu_id = pk::get_scenario().start_year < 224 ? 635 : 629;
						break; // 句扶-刘备父子
					case 928:
						kunshu_id = 430;
						break; // 张超-张邈
					case 929:
						kunshu_id = -1;
						break; // 臧洪-东汉地方政权
					case 930:
						kunshu_id = pk::get_scenario().start_year < 221 ? 343 : 328;
						break; // 司马芝-曹操和曹叡
					case 931:
						kunshu_id = -1;
						break; // 管承-山贼无
					case 932:
						kunshu_id = 367;
						break; // 韩综-孙权
					case 933:
						kunshu_id = 179;
						break; // 韩忠-公孙康
					case 934:
						kunshu_id = pk::get_scenario().start_year < 221 ? 343 : 347;
						break; // 庞淯-曹操父子
					case 935:
						kunshu_id = pk::get_scenario().start_year < 221 ? 343 : 328;
						break; // 赵俨-曹操和曹叡
					case 936:
						kunshu_id = 20;
						break; // 管统-袁谭
					case 937:
						kunshu_id = 17;
						break; // 韩范-袁尚
					case 938:
						kunshu_id = -1;
						break; // 麹演-地方
					case 939:
						kunshu_id = pk::get_scenario().start_year < 215 ? 143 : (pk::get_scenario().start_year < 224 ? 635 : 629);
						break; // 许慈-许靖和刘备父子
					case 940:
						kunshu_id = pk::get_scenario().start_year < 221 ? 343 : 347;
						break; // 许定-曹操父子
					case 941:
						kunshu_id = pk::get_scenario().start_year < 208 ? 636 : (pk::get_scenario().start_year < 221 ? 343 : 347);
						break; // 刘先-刘表和曹操父子
					case 942:
						kunshu_id = 660;
						break; // 魏越-吕布
					case 943:
						kunshu_id = pk::get_scenario().start_year < 200 ? 15 : (pk::get_scenario().start_year < 221 ? 343 : 328);
						break; // 鲜于辅-阎柔和曹操曹叡
					case 944:
						kunshu_id = 484;
						break; // 赵昱-陶谦
					case 945:
						kunshu_id = -1;
						break; // 嵇康-不仕
					case 946:
						kunshu_id = pk::get_scenario().start_year < 221 ? 343 : 328;
						break; // 常林-曹操和曹叡
					case 947:
						kunshu_id = pk::get_scenario().start_year < 221 ? 343 : 328;
						break; // 杜袭-曹操和曹叡
					case 948:
						kunshu_id = pk::get_scenario().start_year < 215 ? 624 : (pk::get_scenario().start_year < 224 ? 635 : 629);
						break; // 张裔-刘璋和刘备父子
					case 949:
						kunshu_id = 629;
						break; // 句安-刘禅
					case 950:
						kunshu_id = 16;
						break; // 惠衢-袁术
					case 951:
						kunshu_id = 189;
						break; // 黄琬-皇甫嵩
					case 952:
						kunshu_id = 636;
						break; // 黄射-刘表
					case 953:
						kunshu_id = 343;
						break; // 耿纪-曹操
					case 954:
						kunshu_id = 343;
						break; // 侯音-曹操
					case 955:
						kunshu_id = 368;
						break; // 陶浚-孙皓
					case 956:
						kunshu_id = 178;
						break; // 公孙晃-公孙恭
					case 957:
						kunshu_id = -1;
						break; // 周朝-山贼无
					case 958:
						kunshu_id = 368;
						break; // 陶黄-孙皓
					case 959:
						kunshu_id = 17;
						break; // 高蕃-袁尚
					case 960:
						kunshu_id = 120;
						break; // 耿武-韩馥
					case 961:
						kunshu_id = 263;
						break; // 皇甫闿-钟会
					case 962:
						kunshu_id = 635;
						break; // 习祯-刘备
					case 963:
						kunshu_id = 226;
						break; // 胡渊-司马炎
					case 964:
						kunshu_id = 65;
						break; // 伍习-郭汜
					case 965:
						kunshu_id = 211;
						break; // 顾邵-孙权
					case 966:
						kunshu_id = 965;
						break; // 顾承-孙权
					case 967:
						kunshu_id = 367;
						break; // 谷利-孙权
					case 968:
						kunshu_id = pk::get_scenario().start_year < 201 ? 370 : 367;
						break; // 胡综-孙策兄弟
					case 969:
						kunshu_id = 368;
						break; // 胡冲-孙皓
					case 970:
						kunshu_id = 226;
						break; // 马隆-司马炎
					case 971:
						kunshu_id = 346;
						break; // 吴敦-臧霸
					case 972:
						kunshu_id = 367;
						break; // 吴范-孙权
					case 973:
						kunshu_id = 189;
						break; // 伍孚-皇甫嵩
					case 974:
						kunshu_id = 636;
						break; // 蔡勋-刘表
					case 975:
						kunshu_id = 65;
						break; // 崔勇-郭汜
					case 976:
						kunshu_id = 598;
						break; // 左灵-李傕
					case 977:
						kunshu_id = 343;
						break; // 史涣-曹操
					case 978:
						kunshu_id = 367;
						break; // 是仪-孙权
					case 979:
						kunshu_id = 367;
						break; // 史迹-孙权
					case 980:
						kunshu_id = pk::get_scenario().start_year < 215 ? 624 : (pk::get_scenario().start_year < 224 ? 635 : 629);
						break; // 射援-刘璋和刘备父子
					case 981:
						kunshu_id = pk::get_scenario().start_year < 215 ? 624 : (pk::get_scenario().start_year < 224 ? 635 : 629);
						break; // 射坚-刘璋和刘备父子
					case 982:
						kunshu_id = 367;
						break; // 谢景-孙权
					case 983:
						kunshu_id = 368;
						break; // 修允-孙皓
					case 984:
						kunshu_id = 367;
						break; // 周胤-孙权
					case 985:
						kunshu_id = 367;
						break; // 修则-孙权
					case 986:
						kunshu_id = 635;
						break; // 习珍-刘备
					case 987:
						kunshu_id = pk::get_scenario().start_year < 221 ? 343 : 347;
						break; // 朱盖-曹操父子
					case 988:
						kunshu_id = 343;
						break; // 朱光-曹操
					case 989:
						kunshu_id = 340;
						break; // 朱赞-曹真
					case 990:
						kunshu_id = 629;
						break; // 柳隐-刘禅
					case 991:
						kunshu_id = 493;
						break; // 李蒙-董卓
					case 992:
						kunshu_id = 660;
						break; // 李封-吕布
					case 993:
						kunshu_id = 367;
						break; // 陆胤-孙权
					case 994:
						kunshu_id = 343;
						break; // 曹安民-曹操
					case 995:
						kunshu_id = pk::get_scenario().start_year < 221 ? 343 : 328;
						break; // 岑威-曹操和曹叡
					case 996:
						kunshu_id = -1;
						break; // 昌豨-山贼无
					case 997:
						kunshu_id = pk::get_scenario().start_year < 193 ? 365 : (pk::get_scenario().start_year < 201 ? 370 : 367);
						break; // 徐琨-孙坚孙策孙权
					case 998:
						kunshu_id = pk::get_scenario().start_year < 221 ? 343 : 328;
						break; // 徐商-曹操和曹叡
					case 999:
						kunshu_id = pk::get_scenario().start_year < 193 ? 493 : 343;
						break; // 段煨-董卓和曹操
				}
				if (kunshu_id == -1)
					continue; // 属于不仕的或其他，这种不需要配置
				// 如果有父亲已经登场的或没登场的，则移动到父亲所属的城市，无视kunshu_id  如果父亲已经死了的，则执行kunshu_id
				int case_0 = -1; // 情形初始化
				if (person_i.father == -1)
					case_0 = 0; // 执行情形0，该武将没有父亲，直接按照君主登场
				else if (pk::get_person(person_i.father).mibun == 身份_无 || pk::get_person(person_i.father).mibun == 身份_俘虏 || pk::get_person(person_i.father).mibun == 身份_死亡)
					case_0 = 0; // 执行情形0，该武将有父亲，但父亲已经死亡或者没有被选中登场，直接按照君主登场
				else if (pk::get_person(person_i.father).mibun >= 身份_君主 && pk::get_person(person_i.father).mibun <= 身份_一般)
					case_0 = 1; // 执行情形1，该武将有父亲，父亲是正常在职武将时，直接照父亲登场
				else if (pk::get_person(person_i.father).mibun == 身份_在野 || pk::get_person(person_i.father).mibun == 身份_未发现 || pk::get_person(person_i.father).mibun == 身份_未登场)
					case_0 = 1; // 执行情形1，该武将有父亲，但父亲是不是在职武将时，直接移动到父亲所在地

				if (case_0 == 0)
				{
					pk::person @kunshu_0 = pk::get_person(kunshu_id);
					if ((kunshu_0.mibun == 身份_无 && pk::decode(pk::get_name(kunshu_0)) != "司马徽") || kunshu_0.mibun == 身份_俘虏 || kunshu_0.mibun == 身份_死亡)
						continue; // 如果君主已经死了则跳过，司马徽特殊处理，可以让石韬等弟子跟随

					// 是正常在职武将时，并且是可以登场的情况下，登场并归属
					auto building_t = pk::get_building(kunshu_0.service);
					if ((kunshu_0.mibun >= 身份_君主 && kunshu_0.mibun <= 身份_一般) && (pk::get_scenario().virtual || (!pk::get_scenario().virtual && pk::get_scenario().start_year >= person_i.appearance)))
					{
						set_person_district(@person_i, building_t); // 把他设置到历史归属的君主旗下
						pk::trace(pk::format("登场者id：{}，名字：{}，地点：{}，归属君主：{}", person_id, pk::decode(pk::get_name(person_i)), pk::decode(pk::get_name(building_t)), pk::decode(pk::get_name(kunshu_0))));
					}
					else
					{
						pk::move(person_i, building_t); // 移动到历史归属君主所属据点
														// pk::trace(pk::format("移动者id：{}，名字：{}，地点：{}，归属君主：{}", person_id, pk::decode(pk::get_name(person_i)), pk::decode(pk::get_name(building_t)), pk::decode(pk::get_name(kunshu_0))));
					}
				}
				else if (case_0 == 1)
				{
					pk::person @father_0 = pk::get_person(person_i.father);
					if (father_0.mibun == 身份_无 || father_0.mibun == 身份_俘虏 || father_0.mibun == 身份_死亡)
						continue; // 如果君主已经死了则跳过

					// 是正常在职武将时，并且是可以登场的情况下，登场并归属
					auto building_t = pk::get_building(father_0.service);
					if ((father_0.mibun >= 身份_君主 && father_0.mibun <= 身份_一般) && (pk::get_scenario().virtual || (!pk::get_scenario().virtual && pk::get_scenario().start_year >= person_i.appearance)))
					{
						set_person_district(@person_i, building_t); // 把他设置到父亲的旗下
						pk::trace(pk::format("登场者id：{}，名字：{}，地点：{}，父亲：{}", person_id, pk::decode(pk::get_name(person_i)), pk::decode(pk::get_name(building_t)), pk::decode(pk::get_name(father_0))));
					}
					else
					{
						pk::move(person_i, building_t); // 移动到父亲所属据点
														// pk::trace(pk::format("移动者id：{}，名字：{}，地点：{}，父亲：{}", person_id, pk::decode(pk::get_name(person_i)), pk::decode(pk::get_name(building_t)), pk::decode(pk::get_name(father_0))));
					}
				}
			}
		}

		// 获取有效的145将列表
		pk::list<pk::person @> get_145_person()
		{
			pk::list<pk::person @> list;
			for (int i = 855; i < 1000; i++)
			{
				pk::person @person_0 = pk::get_person(i);
				if (person_0 is null)
					continue; // 继续
				if (person_0.mibun == 身份_无 || person_0.mibun == 身份_死亡 || person_0.mibun == 身份_君主 || person_0.mibun == 身份_都督 || person_0.mibun == 身份_一般 || person_0.mibun == 身份_在野)
					continue; // 如果身份是这些则跳过，这些身份是被手动配置过的
				// pk::info(pk::format("{}:{} =》{}", pk::decode(pk::get_name(person_0)), person_145_name[i - 855], pk::decode(pk::get_name(person_0)) != person_145_name[i - 855]));
				if (pk::decode(pk::get_name(person_0)) != person_145_name[i - 855])
				{
					pk::trace(pk::decode(pk::get_name(person_0)) + person_145_name[i - 855]);
					has_been_changed = true; // 说明可能被修改过，则标记
					continue;				 // 姓名没有对上，跳过
				}
				list.add(person_0);
			}
			return list;
		}

		void set_person_district(pk::person @person_i, pk::building @building_t)
		{
			pk::set_district(person_i, building_t.get_district_id());																												 // 设置到军团
			pk::move(person_i, building_t);																																			 // 移动到据点
			person_i.mibun = 身份_一般;																																				 // 身份一般
			person_i.rank = 官职_无;																																				 // 官职无
			person_i.loyalty = 100 - int(pk::get_aishou_distance(person_i, pk::get_kunshu_id(building_t)) / 3) - (pk::is_dislike(person_i, pk::get_kunshu_id(building_t)) ? 10 : 0); // 是否厌恶君主，忠诚度
			person_i.update();
		}

		// 随机增减寿命功能
		void random_age_within(int n)
		{
			for (int i = 0; i < ending; i++)
			{
				auto person_0 = pk::get_person(i);
				if (person_0 is null)
					continue; // 继续
				if (person_0.mibun == 身份_无 || person_0.mibun == 身份_死亡)
					continue; // 如果身份是这些则跳过
				// 下限从（武将登场一年后）或（剧本开局一年后）开始随机，而不是先随机再取最大值，概率略有不同（暂不用此方案）
				// person_0.death = ch::randint(pk::max((pk::get_scenario().start_year + 1), pk::max((person_0.appearance + 1), (person_0.death - arr_age[n]))), person_0.death + arr_age[n]);

				auto random_n = ch::randint(-arr_age[n], arr_age[n]); // 年龄随机增减的数
				// pk::trace(pk::format("名字：{}，增减的年数：{}", pk::decode(pk::get_name(person_0)), random_n));
				// 取（原死亡年份+随机数）和（武将登场一年后）和（剧本开局一年后）的最大值，至少是（武将登场一年后）或（剧本开局一年后），年龄可破100岁
				person_0.death = pk::max((pk::get_scenario().start_year + 1), pk::max((person_0.appearance + 1), person_0.death + random_n));
				person_0.update();
			}
		}

		void onNewSeason()
		{
			if (tips_on and pk::get_player_count() > 0)
				pk::scene(pk::scene_t(scene_开局tips)); // 载入存档开局tips
		}

		// 美女载入存档的tips
		void scene_开局tips()
		{

			pk::person @美女 = pk::get_person(武将_町娘);
			// 给美女改个名字
			int face_0 = 美女.face;
			string sei_0 = 美女.sei;
			string mei_0 = 美女.mei;

			array<int> beauty_face = { 武将_貂蝉, 武将_甄氏, 武将_王异, 武将_张春华, 武将_邹氏, 武将_大乔, 武将_小乔, 2205, 武将_黄月英, 武将_孙尚香 };																				 // 头像ID
			array<string> beauty_sei = { pk::encode("貂"), pk::encode("甄"), pk::encode("王"), pk::encode("张"), pk::encode("邹"), pk::encode("大"), pk::encode("小"), pk::encode("王"), pk::encode("黄"), pk::encode("孙") };		 // 姓
			array<string> beauty_mei = { pk::encode("蝉"), pk::encode("氏"), pk::encode("异"), pk::encode("春华"), pk::encode("氏"), pk::encode("乔"), pk::encode("乔"), pk::encode("元姬"), pk::encode("月英"), pk::encode("尚香") }; // 名
			if (pk::get_scenario().no == 血色剧本)																																													 // 血色专属
			{
				beauty_face = { 732, 1516, 1517, 1519, 1522, 1524, 1525, 1526, 1528, 1527 };
				beauty_sei = { pk::encode("甄"), pk::encode("上官"), pk::encode("卓"), pk::encode("蔡"), pk::encode("西"), pk::encode("王"), pk::encode("杨"), pk::encode("赵"), pk::encode("陈"), pk::encode("冯") };			 // 姓
				beauty_mei = { pk::encode("宓"), pk::encode("婉儿"), pk::encode("文君"), pk::encode("琰"), pk::encode("施"), pk::encode("昭君"), pk::encode("玉环"), pk::encode("飞燕"), pk::encode("圆圆"), pk::encode("小怜") }; // 名
			}

			int random_m = pk::rand(10, int(pk::get_tick_count()), int(pk::get_tick_count()));
			美女.face = beauty_face[random_m];
			美女.sei = beauty_sei[random_m];
			美女.mei = beauty_mei[random_m];
			美女.update();

			/* random_seed += 1;
			random_seed = random_seed % 7;  //循环加1 */
			int random_sort = pk::rand(msg_tips.length, int(pk::get_tick_count()), int(pk::get_tick_count()));

			string msg = msg_tips[random_sort];
			pk::message_box(pk::encode(msg), 美女);

			// 给美女头像和姓名重置
			美女.face = face_0;
			美女.sei = sei_0;
			美女.mei = mei_0;
			美女.update();
		}

		void trace()
		{
			for (int i = 0; i < 670; i++)
			{
				auto person_0 = pk::get_person(i);
				auto age_0 = int(person_0.death) - int(person_0.birth);
				//pk::trace(pk::format("id为：{}，年龄为：{}", i, age_0));
			}
		}

		void set_den_pos()
		{
			/*
				1 城池2格内不能有贼
				2 封地2格内不出现
				3 不出现在非陆地上
				4 不可出现在森林地形
				5 不能与内政地重合
				6 不能与即将解锁的内政地重合
			 */

			array<pk::point> pos;
			array<int> terrain_list = { 地形_毒泉, 地形_森, 地形_川, 地形_河, 地形_海, 地形_山, 地形_浅滩, 地形_渡, 地形_崖, 地形_岸, 地形_栈道, 地形_荒地 };
			array<int> den_num(城市_末, 0);

			array<pk::point> den_pos;

			pk::info("time1");
			for (int i = 0; i < 据点_末; i += 1)
			{
				pk::point temp_pos = pk::get_building(i).pos;
				pos.insertLast(temp_pos);
				auto arr = pk::range(temp_pos, 1, 3);
				for (int a = 0; a < int(arr.length); a += 1)
				{
					pos.insertLast(arr[a]);
				}
			}

			for (int i = 0; i < ch::get_spec_end(); i++) // 注意，地名末和length不一定一致
			{
				pk::point temp_pos = ch::get_spec_pos(i);
				pos.insertLast(temp_pos);
				auto arr = pk::range(temp_pos, 1, 2);
				for (int a = 0; a < int(arr.length); a += 1)
				{
					pos.insertLast(arr[a]);
				}
			}

			//pk::info("time2");

			for (int x = 0; x < 200; x += 1)
			{
				for (int y = 0; y < 200; y += 1)
				{
					if (pk::rand_bool(10)) continue;
					pk::point temp_pos = pk::point(x, y);
					int city_id = pk::get_city_id(temp_pos);
					if (pos.find(temp_pos) >= 0) continue;
					pk::hex @hex = pk::get_hex(temp_pos);
					int terrain = hex.terrain;
					if (terrain < 0 or terrain_list.find(terrain) >= 0 or terrain > 地形_间道) continue;
					if (den_num[city_id] > 7) continue;
					bool short_distance = false;
					for (int i = 0; i < int(den_pos.length); i += 1)
					{
						int distance = pk::get_distance(den_pos[i], temp_pos);
						if (distance <= 4)
						{
							short_distance = true;
							break;
						}
					}
					if (!short_distance)
					{
						hex.den = true;
						den_num[city_id] += 1;
						den_pos.insertLast(temp_pos);
					}
				}
			}

			pk::info("time3");

		}

		void gen_spec_terrain_check()
		{
			for (int i = 0; i < ch::get_spec_end(); i++)
			{
				pk::point pos = ch::get_spec_pos(i);
				pk::hex @hex = pk::get_hex(pos);
				hex.terrain = 地形_荒地;


				//pk::trace("pos:"+pos.x+","+pos.y+"地形"+hex.terrain);
			}
		}


		void set_troops_policy()
		{
			for (int building_id = 0; building_id < 据点_末; building_id += 1)
			{
				// 开局设定兵役政策为2;
				auto building_p = ch::get_baseIA(building_id);
				building_p.building_policy = 2;
			}
		}

	} // class Main
	Main main;
}

const array<string> msg_tips = {
	"县城拥有钱粮和士兵的收入,但是要\x1b[27x县城管理\x1b[0x后才可以获得这些收入,要尽可能早的县城管理呢~。",
	"\x1b[27x县城\x1b[0x不会被破坏，耐久降为0后将\x1b[1x自动变更归属\x1b[0x。",
	"己方县城能为周围部队提供30点防御的\x1b[27x防御光环\x1b[0x,因此在战斗中要尽早占领呢~。",
	"当城市太多管不过来的时候,可以开启\x1b[27x自动内政\x1b[0x~把繁琐的内政工作交给其他将军们去处理哦~~。",
	"守军的攻击力取决于\x1b[27x士气\x1b[0x,围城、火烧、冲车破碎、计略等都能有效降低士气呢~~。",
	"兵役政策会影响人口转化为兵役的比例和上限,均衡政策是80%,意味着兵役增长不会超过当月人口增长的80%~~。",
	"兵役政策会影响人口转化为兵役的比例和上限,动员政策是120%,意味着兵役增长不会超过当月人口增长的120%~~。",
	"兵役政策会影响人口转化为兵役的比例和上限,安民政策是50%,意味着兵役增长不会超过当月人口增长的50%~~。",
	"每月人口增长时,根据兵役政策不同,部分增长的人口转化为兵役人口,\n均衡政策时,人口每个月增加2000,会变成人口增加400,兵役增加1600~。",
	"每月人口增长时,根据兵役政策不同,部分增长的人口转化为兵役人口,\n安民政策时,人口每个月增加2000,会变成人口增加1000,兵役增加1000~。",
	"每月人口增长时,根据兵役政策不同,部分增长的人口转化为兵役人口,\n动员政策时,人口每个月增加2000,会变成人口减200,兵役增加2200~。",
	"守军的防御力取决于\x1b[27x城市耐久和士气\x1b[0x,如果敌方城市很坚固,可以先降低耐久再攻城呢~~。",
	"井阑、冲车、投石在攻城时都可以\x1b[27x无视城墙高度\x1b[0x,如果敌方城市很坚固,可以考虑用兵器进行攻击呀~。",
	"兵临城下的时候,征兵,生产等各项内政效果都会\x1b[27x大打折扣\x1b[0x,因此要防止敌人兵临城下呀!~~。",
	"\x1b[27x拜访\x1b[0x可以遇到各种各样有趣的事件,甚至有可能获得神秘奖励,快去试试吧~~。",
	"\x1b[27x探索\x1b[0x可以遇到各种各样的事件,甚至有可能获得神秘奖励,快去试试吧~~。",
	"\x1b[27x高度差\x1b[0x会大大的影响部队攻击效果,因此在战斗中要尽可能占领高地,居高临下的打击敌人!!~~。",
	"游戏的「情报履历」要开启并设置为「详细」，避免错过重要情报哦~",
	"自动内政时如果\x1b[27x内政官已经行动或者出门了\x1b[0x，内政效果会大打折扣呢!",
	"\x1b[27x「不同季节的部队移动力不同」\x1b[0x，春秋最高,冬天最低,出征时要留意噢~",
	"野外的时候部队可以通过\x1b[27x「计略-砍伐」\x1b[0x，来获得资金,但是要小心会失败噢~",
	"野外的时候部队可以通过\x1b[27x「计略-捕鱼」\x1b[0x，来获得粮食,海里的鱼要比河里的鱼肥的多!呢~~",
	"戟兵一大重要特性是\x1b[27x「防御光环效果翻倍」\x1b[0x，可以充分利用这个特性进行防守哦~",
	"弩兵一大重要特性是\x1b[27x「高差伤害翻倍」\x1b[0x，可以充分利用这个地形发动超高攻击的攻击哦~",
	"骑兵一大重要特性是\x1b[27x「战法气力杀伤和气力回复」\x1b[0x，可以利用这个特性对敌方阵地进行冲杀!",
	"己方领地内有部队战斗发生时,己方部分人口会变成\x1b[27x「州流民」\x1b[0x,不再属于己方,因此要尽量避免在己方领地开战呢~",
	"部队被消灭时,部分士兵不会死亡,会成为逃兵,变成\x1b[27x「州流民」\x1b[0x,「州流民」是州郡潜在的人口,可以想办法安置呢~",
	"城市或者据点被包围时,城市的攻击\x1b[27x会被分摊\x1b[0x,伤害会有明显降低呢~",
	"城市或者据点被包围时,会造成\x1b[27x「合围伤害」\x1b[0x包围部队越多,伤害越高呢~",
	"地形可以\x1b[27x显著的影响各种部队的攻防\x1b[0x,比如森林对枪兵有利,平原对骑兵有利等等~要善加利用呀~",
	"地形可以\x1b[27x显著的影响各种计略的成功率和伤害\x1b[0x,比如森林中火计会大幅增强,湿地的火计就很难有效啦~",
	"「异族贼兵」与其他势力达成协议进攻我方，可不管你城市的治安高低与否哦~他们给的实在太多了。",
	"人口的增长率主要取决于城市治安、拥立献帝、君主官职、 君主魅力和政治等等~要特别留意呢~ 。",
	"\x1b[27x市场效率和农场效率主要取决于人口\x1b[0x,人口决定了各项基础收入的上限,要特别注意呢~ 。",
	"兵临城下的话，\x1b[27x人口\x1b[0x会大量减少，尽量防止被兵临城下吧~",
	"哪怕占领敌方势力所有大城，敌方也会依托\x1b[27x小城\x1b[0x做殊死抵抗，要灭掉势力请\x1b[27x占领其所有据点吧\x1b[0x~",
	pk::format("随人口增加({}万,{}万,{}万,{}万)，城市规模可以通过扩建变大，内政用地数量也会增加~所以要善待领地内子民呀!~", 一级城市阈值 / 10000, 二级城市阈值 / 10000, 三级城市阈值 / 10000, 四级城市阈值 / 10000) };